#include "ModuleLBP.h"

////////////////////////////////////////////////////////////////////////////////
void ModuleLBP::init(QCVModuleHandlerInterface * parent)
{
  this->parent=parent;
  
  win=new QWidget();
  layout=new QVBoxLayout(win);

	lbp=new LBP();
	
	sb_nombre=new QSpinBox(win);
	sb_nombre->setRange(4,30);
	sb_nombre->setValue(8);
	sb_nombre->setPrefix(tr("P="));

	sb_rayon=new QSpinBox(win);
	sb_rayon->setRange(1,64);
	sb_rayon->setValue(1);
	sb_rayon->setPrefix(tr("R="));	
	
	mode=new QComboBox(win);
	mode->addItem("Histogramme");
	mode->addItem("Histogramme Uniforme");
	mode->addItem("Descripteurs");

	QHBoxLayout * hlayout=new QHBoxLayout();
	hlayout->addWidget(sb_rayon);
	hlayout->addWidget(sb_nombre);
	layout->addWidget(mode);
	layout->addLayout(hlayout);	

	connect(sb_nombre,SIGNAL(valueChanged(int)),this,SLOT(s_initLBP(int)));
	connect(sb_rayon,SIGNAL(valueChanged(int)),this,SLOT(s_initLBP(int)));
	s_initLBP(0);

	hist.release();
	descriptors.release();
}
////////////////////////////////////////////////////////////////////////////////
void ModuleLBP::free()
{
  delete win;
}
//////////////////////////////////////////////////////////////////////////////// 
cv::Mat & ModuleLBP::process()
{
	if(mode->currentIndex()==0)
	{
		lbp->getHist(hist);
	}
	else if(mode->currentIndex()==1)
	{
		lbp->getUniformHist(hist);
	}
	else if(mode->currentIndex()==2)
	{

	}
	return hist;
}
////////////////////////////////////////////////////////////////////////////////
void ModuleLBP::setInput(int n,const cv::Mat & m)
{
  if(n==0)
  {
		image=m;
  	lbp->setImage(image);
  }		
	else if(n==1)
	{
		keyspoints=m.clone();
	}
}
////////////////////////////////////////////////////////////////////////////////
QWidget* ModuleLBP::widget()
{
  return win;
}
////////////////////////////////////////////////////////////////////////////////
QString ModuleLBP::getName()
{
  return trUtf8("Local Binary Patterns");
}
////////////////////////////////////////////////////////////////////////////////
int ModuleLBP::nbInputs()
{
  return 1+(mode->currentIndex()==2);
}
////////////////////////////////////////////////////////////////////////////////
bool ModuleLBP::setParams(QString params)
{
	QStringList params_list=params.split(";");

	if(params_list.size()==1)
	{
		mode->setCurrentIndex(params_list[0].toInt());
		return true;
	}
	else
	{
		return false;
	}
}
////////////////////////////////////////////////////////////////////////////////
QString ModuleLBP::getParams()
{
	return QString::number(mode->currentIndex());
	
}

////////////////////////////////////////////////////////////////////////////////
QCVModuleInterface * ModuleLBP::clone()
{
	return new ModuleLBP;
}

////////////////////////////////////////////////////////////////////////////////
QString ModuleLBP::help(int id)
{
	if(id==-2)
	{
		return tr("Module de calcul des Local Binary Patterns");
	}
	else if(id==-1)
	{
		if(mode->currentIndex()==0 || mode->currentIndex()==1)
		{		
			return tr("histogramme");
		}
		else
		{
			return tr("descripteurs");
		}
	}
	else if(id==0)
	{
		return tr("image");
	}
	else if(id==1)
	{
		return tr("keyspoints");
	}
	else
	{
		return tr("erreur");
	}
}

////////////////////////////////////////////////////////////////////////////////
void ModuleLBP::s_initLBP(int n)
{
	lbp->create(sb_rayon->value(),sb_nombre->value());
}
////////////////////////////////////////////////////////////////////////////////
Q_EXPORT_PLUGIN2(ModuleLBP_plugin,ModuleLBP);                                                                               
